package cn.dkdoo.utils.config.rollbackData;

import com.fasterxml.jackson.annotation.JsonInclude;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;

/**
 * @author nicky
 * @date 2021/5/10 下午3:42
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RollbackDataTable {
    private static final Logger logger = LoggerFactory.getLogger(RollbackDataTable.class);

    /**
     * 回滚时候，反射调用的bean
     * todo-nicky 减少存储数据
     */
    private String beanName;

    /**
     * es 只需要绑定执行回滚bean的Name即可
     */
    private String esBean;

    //es表名，不需要存储，维护好 mongo只读表 和 es只读表直接的关系即可
    //private String esIndex;

    /**
     * RollbackDetail.data 的className
     * 用于回滚的dataClass，应该是属性最全的基类，所有不放在RollbackDetail.dataClass
     */
    private String dataClass;

    // key-文档id/子主题 val-待回滚的文档/待重发的消息
    private Map<String, RollbackDetail> datas;

    public RollbackDataTable(String beanName) {
        this.beanName = beanName;
        this.datas = new HashMap<>();
    }

    public RollbackDataTable(String beanName, String dataClass) {
        this.beanName = beanName;
        this.dataClass = dataClass;
        this.datas = new HashMap<>();
    }

    public void addOneId(Map<String, RollbackDetail> datasCur) {
        for (Map.Entry<String, RollbackDetail> detailEntry : datasCur.entrySet()) {
            String id = detailEntry.getKey();
            if (this.datas.containsKey(id)) {
                // 数据库：只保证事物最终一致性即可，所以只处理【同一个事物号，同一张表，同一个id】的首次
                // 队列： 同一个id发了多次，回滚的时候，只要发一次就行了
                continue;
            }
            this.datas.put(id, detailEntry.getValue());//哪个文档/哪个重发的消息
        }
    }

    public void addOneId(String id, Object data, TraOperationType type) {
        Map<String, RollbackDetail> datas = this.datas;
        if (datas.containsKey(id)) {
            // 数据库：只保证事物最终一致性即可，所以只处理【同一个事物号，同一张表，同一个id】的首次
            // 队列： 同一个id发了多次，回滚的时候，只要发一次就行了
            return;
        }
        RollbackDetail rollbackDetail = new RollbackDetail(data, type);//哪个文档/哪个重发的消息
        datas.put(id, rollbackDetail);
    }


    public String getBeanName() {
        return beanName;
    }

    public void setBeanName(String beanName) {
        this.beanName = beanName;
    }

    public Map<String, RollbackDetail> getDatas() {
        return datas;
    }

    public void setDatas(Map<String, RollbackDetail> datas) {
        this.datas = datas;
    }

    public String getDataClass() {
        return dataClass;
    }

    public void setDataClass(String dataClass) {
        this.dataClass = dataClass;
    }

    public String getEsBean() {
        return esBean;
    }

    public void setEsBean(String esBean) {
        this.esBean = esBean;
    }
}
